import imaplib
import email
from email.header import decode_header
from datetime import datetime, timedelta
import re
import sys
import io

# 确保标准输出支持UTF-8编码
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')

# 邮箱配置 - 请根据公司实际IMAP服务器信息修改
IMAP_SERVER = 'imap.baosight.com'  # 通常是imap.域名，需要确认
EMAIL = '195277@baosight.com'
PASSWORD = 'tcQ7EGF3YzTFHctR'  # 注意：某些邮箱可能需要使用授权码而非登录密码


def decode_str(s):
    """解码邮件中的字符串，处理各种编码情况"""
    if not s:
        return ""
    if isinstance(s, bytes):
        try:
            return s.decode('utf-8')
        except UnicodeDecodeError:
            pass

    decoded_parts = decode_header(s)
    result = []
    for part, encoding in decoded_parts:
        if isinstance(part, bytes):
            if encoding:
                try:
                    result.append(part.decode(encoding))
                except (UnicodeDecodeError, LookupError):
                    result.append(part.decode('utf-8', errors='ignore'))
            else:
                try:
                    result.append(part.decode('utf-8'))
                except UnicodeDecodeError:
                    try:
                        result.append(part.decode('gbk'))
                    except UnicodeDecodeError:
                        result.append(part.decode('latin-1'))
        else:
            result.append(str(part))
    return ''.join(result)


def clean_email_content(content):
    """清理邮件内容，移除多余样式和重复信息"""
    # 移除CSS样式块
    content = re.sub(r'\[list-style-type\].*?}', '', content, flags=re.DOTALL)
    content = re.sub(r'\.default-font-\d+?{.*?}', '', content, flags=re.DOTALL)

    # 移除HTML相关标签和属性
    content = re.sub(r'<.*?>', '', content)

    # 移除多余的空格和空行
    content = re.sub(r'\s+', ' ', content)
    content = re.sub(r' {2,}', ' ', content)

    # 修复列表编号后的格式
    content = re.sub(r'(\d+?)\）', r'\n\1）', content)  # 在中文括号前添加换行
    content = re.sub(r'(\d+?)\)', r'\n\1)', content)  # 在英文括号前添加换行

    # 为"本周工作任务"和"下周工作任务"添加换行
    content = re.sub(r'本周工作任务', r'\n\n本周工作任务', content)
    content = re.sub(r'下周工作任务', r'\n\n下周工作任务', content)

    # 去除首尾空白
    return content.strip()


def get_email_content(msg):
    """提取并清理邮件正文内容"""
    content = ""
    # 多部分邮件处理
    if msg.is_multipart():
        for part in msg.walk():
            # 忽略附件
            content_type = part.get_content_type()
            content_disposition = str(part.get("Content-Disposition"))

            if "attachment" in content_disposition:
                continue

            # 文本内容处理
            if content_type == "text/plain" or content_type == "text/html":
                try:
                    part_content = part.get_payload(decode=True)
                    # 尝试解码
                    charset = part.get_content_charset()
                    if charset:
                        try:
                            part_content = part_content.decode(charset)
                        except UnicodeDecodeError:
                            part_content = part_content.decode('utf-8', errors='ignore')
                    else:
                        part_content = decode_str(part_content)

                    content += part_content + "\n\n"
                except Exception as e:
                    content += f"[无法解析的内容: {str(e)}]\n\n"
    else:
        # 单部分邮件处理
        content_type = msg.get_content_type()
        if content_type == "text/plain" or content_type == "text/html":
            try:
                part_content = msg.get_payload(decode=True)
                charset = msg.get_content_charset()
                if charset:
                    try:
                        part_content = part_content.decode(charset)
                    except UnicodeDecodeError:
                        part_content = part_content.decode('utf-8', errors='ignore')
                else:
                    part_content = decode_str(part_content)

                content = part_content
            except Exception as e:
                content = f"[无法解析的内容: {str(e)}]"

    # 清理内容
    cleaned_content = clean_email_content(content)

    # 去除重复内容（如果同一内容出现多次）
    lines = cleaned_content.split('\n')
    seen = set()
    unique_lines = []
    for line in lines:
        stripped = line.strip()
        if stripped and stripped not in seen:
            seen.add(stripped)
            unique_lines.append(line)

    return '\n'.join(unique_lines)


def fetch_weekly_reports():
    try:
        # 连接到IMAP服务器
        mail = imaplib.IMAP4_SSL(IMAP_SERVER)
        mail.login(EMAIL, PASSWORD)
        mail.select('inbox')

        # 计算4天前的日期
        four_days_ago = (datetime.now() - timedelta(days=4)).strftime('%d-%b-%Y')
        print(f"搜索从 {four_days_ago} 至今的邮件...")

        # 先搜索时间范围
        status, data = mail.search(None, f'(SINCE {four_days_ago})')

        if status != 'OK':
            print("搜索时间范围失败")
            return

        email_ids = data[0].split()
        if not email_ids:
            print("在时间范围内未找到任何邮件")
            return

        print(f"在时间范围内找到 {len(email_ids)} 封邮件，正在筛选含'周报'的邮件...")

        # 存储符合条件的邮件ID
        matching_ids = []

        # 遍历所有在时间范围内的邮件，检查主题
        for email_id in reversed(email_ids):
            # 只获取邮件头部信息，提高效率
            status, data = mail.fetch(email_id, '(BODY.PEEK[HEADER.FIELDS (SUBJECT)])')

            if status != 'OK':
                continue

            # 解析主题
            header = data[0][1].decode('utf-8', errors='ignore')
            if '主题:' in header or 'Subject:' in header:
                subject = decode_str(header)
                if '周报' in subject:
                    matching_ids.append(email_id)

        if not matching_ids:
            print("未找到标题包含'周报'的邮件")
            return

        print(f"找到 {len(matching_ids)} 封符合条件的邮件：\n")

        # 显示符合条件的邮件详细信息和内容
        for i, email_id in enumerate(matching_ids, 1):
            status, data = mail.fetch(email_id, '(RFC822)')
            if status != 'OK':
                continue

            msg = email.message_from_bytes(data[0][1])
            from_addr = decode_str(msg.get('From', ''))
            subject = decode_str(msg.get('Subject', ''))
            date_str = decode_str(msg.get('Date', ''))
            content = get_email_content(msg)

            date_match = re.search(r'\d{2} \w{3} \d{4} \d{2}:\d{2}:\d{2}', date_str)
            date = date_match.group() if date_match else date_str

            print(f"===== 邮件 {i} =====")
            print(f"主题: {subject}")
            print(f"发件人: {from_addr}")
            print(f"日期: {date}")
            print("\n内容:")
            print("-" * 60)
            print(content)
            print("-" * 60 + "\n")

        mail.close()
        mail.logout()

    except Exception as e:
        print(f"发生错误: {str(e)}")


if __name__ == "__main__":
    print("""我需要你结合我的需求，给整理下面的内容（输出的内容整理在一个txt文件中，不使用其他任何的特殊格式，换行符和制表符记得好好使用）：
按照模块整理每个人的工作项，若该人员无相关工作项则该人员在该模块应该忽略，最后每个模块的目标输出格式应该是
模块名称
人员1名称:
	1.人员1的工作项内容1
	2.人员1的工作项内容2
人员2名称:
	1.人员2的工作项内容1
	2.人员2的工作项内容2
...
上面的模块有个特殊要求 【IOMaping、WatchTable】模块的内容要做合并，另外还需要合并的模块有【GVS、UDT】模块，以及【Online，online-diagnosis】模块
整合所有人的下周工作计划

整合所有人的需要协调事项
下面的是原文输出""")
    fetch_weekly_reports()
